package com.utils;

import io.netty.handler.codec.http.multipart.FileUpload;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author linyu.dai
 * @project rpc
 * @description
 * @creat 2022/11/30 14:00:11
 */
@Slf4j
public class MyReflectUtils {
    public static final HashMap<String, Class<?>> typeDic = new HashMap<>();

    //基本数据类型
    public static final List<Class<?>> basics = List.of(
            Integer.class,
            Double.class,
            Float.class,
            Long.class,
            Short.class,
            Byte.class,
            Boolean.class,
            Character.class,
            String.class,
            FileUpload.class
    );

    public static Boolean isBasics(Class<?> cls){
        log.info("参数类型{}", cls);
        Class<?> wrapperClass = typeDic.get(cls.getName());
        //如果是包装类型
        if (wrapperClass == null) {
            return basics.contains(cls);
        }
        return basics.contains(cls);
    }

    static {
        typeDic.put(int.class.getName(), Integer.class);
        typeDic.put(double.class.getName(), Double.class);
        typeDic.put(float.class.getName(), Float.class);
        typeDic.put(long.class.getName(), Long.class);
        typeDic.put(short.class.getName(), Short.class);
        typeDic.put(byte.class.getName(), Byte.class);
        typeDic.put(boolean.class.getName(), Boolean.class);
        typeDic.put(char.class.getName(), Character.class);
    }

    /**
     * String 转 任意基本类型的包装类
     *
     * @param cls   基本类型
     * @param value String字符串
     * @return 基本类型的包装类的对象
     * @throws Exception 请务必保证目标类型有把String转成目标类型的构造方法
     */
    @SuppressWarnings("unchecked")
    public static <T> T castToWrapperClassObject(Class<T> cls, String value)  {
        try {
            Class<?> wrapperClass = typeDic.get(cls.getName());
            //如果是包装类型
            if (wrapperClass == null) {
                return cls.getConstructor(String.class).newInstance(value);
            }
            //如果是普通类型
            return (T) wrapperClass.getConstructor(String.class).newInstance(value);
        }catch (Exception e){
            log.error("类型转换失败");
            return null;
        }
    }
}
